package com.shop.zzh.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiKey;
import springfox.documentation.service.AuthorizationScope;
import springfox.documentation.service.SecurityReference;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.ArrayList;
import java.util.List;

/**
 * Swagger2API文档的配置
 * Swagger-UI是HTML, Javascript, CSS的一个集合，可以动态地根据注解生成在线API文档。
 */
@Configuration
@EnableSwagger2
public class Swagger2Config {
	
	 @Bean
	    public Docket createRestApi(){
	        return new Docket(DocumentationType.SWAGGER_2)
	                .apiInfo(new ApiInfoBuilder()
	                        .title("SwaggerUI演示")//标题
	                        .description("mall-zc")//描述
	                        .contact("zzh")//zuozhe
	                        .version("2.7")//版本
	                        .build()
	                )
	                .select()
	                //为当前包下controller生成API文档
	                .apis(RequestHandlerSelectors.basePackage("com.shop.zzh.controller"))
	                //为有@Api注解的Controller生成API文档
//	                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
	                //为有@ApiOperation注解的方法生成API文档
//	                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
	                .paths(PathSelectors.any())
	                .build()
					//添加登录认证
					.securitySchemes(securitySchemes())
					.securityContexts(securityContexts());
	    }

		private List<ApiKey> securitySchemes() {
			//设置请求头信息
			List<ApiKey> result = new ArrayList<>();
			ApiKey apiKey = new ApiKey("Authorization", "Authorization", "header");
			result.add(apiKey);
			return result;
		}

	 	private List<SecurityContext> securityContexts() {
	        //设置需要登录认证的路径
	        List<SecurityContext> result = new ArrayList<>();
	        result.add(getContextByPath("/video/.*"));
	        return result;
	    }

	    private SecurityContext getContextByPath(String pathRegex){
	        return SecurityContext.builder()
	                .securityReferences(defaultAuth())
	                .forPaths(PathSelectors.regex(pathRegex))
	                .build();
	    }

	    private List<SecurityReference> defaultAuth() {
	        List<SecurityReference> result = new ArrayList<>();
	        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
	        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
	        authorizationScopes[0] = authorizationScope;
	        result.add(new SecurityReference("Authorization", authorizationScopes));
	        return result;
	    }

}
